<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
namespace Agp\CoreBundle\Manager;

use Doctrine\ORM\EntityManager;
use Agp\CoreBundle\Entity\Evento;
use Agp\CoreBundle\Manager\BaseManager;
use Agp\CoreBundle\Entity\EventoLista;
use Agp\CoreBundle\Entity\EventoProduto;
use Agp\CoreBundle\Entity\Produto;
use Agp\CoreBundle\Entity\EventoTerminalEmpresa;
use Agp\CoreBundle\Entity\TerminalEmpresaConfig;
use Agp\CoreBundle\Entity\EventoConfig;
use Agp\CoreBundle\Entity\Ambiente;
use Agp\CoreBundle\Entity\ListaPreco;
use Agp\CoreBundle\Entity\SetorCoordenada;
use Agp\CoreBundle\Entity\AmbienteProduto;

/**
 * Description of EventoManager
 *
 * @author bondcs
 */
class EventoManager extends BaseManager
{
    public function persist($entity) {
        $entity->setAtualizado(new \DateTime);
        $entity->setEventoConfig(new EventoConfig());
        $entity->getInfo()->setTitulo($this->utils->replace_accents($entity->getInfo()->getDescricao()));
        
        $user = $this->container->get('security.context')->getToken()->getUser();
        if (!$user->isAdmin()){
            $entity->addPessoa($user);
        }
        parent::persist($entity);
    }
    
    public function update($entity) {
        $entity->setAtualizado(new \DateTime);
        $entity->getInfo()->setTitulo($this->utils->replace_accents($entity->getInfo()->getDescricao()));
        parent::update($entity);
    }

    public function addListaPreco($listas, $evento){
        
        $eventoListaRep = $this->container->get('doctrine')->getRepository("AgpCoreBundle:EventoLista");
        
        foreach ($listas as $lista){
            
            foreach ($lista->getListaPrecoReference() as $produtoLista){
                
                if ($produtoLista->getProduto()->getSituacao() != Produto::SIT_INATIVO){
                    $eventoProduto = new EventoProduto();
                    $eventoProduto
                        ->setEmpresa($produtoLista->getEmpresa())
                        ->setLimiteVendas($produtoLista->getLimiteVendas())
                        ->setListaPreco($produtoLista->getListaPreco())
                        ->setProduto($produtoLista->getProduto())
                        ->setVlrProduto($produtoLista->getVlrProduto())
                        ->setEvento($evento);
                    
                    $this->em->persist($eventoProduto);
                }
            } 
            
            $eventoLista = new EventoLista();
            $eventoLista->setLista($lista);
            $eventoLista->setEvento($evento);
            $eventoLista->setOrdem($eventoListaRep->getLastOrdem($evento)+1);
            $this->em->persist($eventoLista);
            $this->flush();
        }
    }
    
    public function removerListaEvento($evento, $codLista){
        
        foreach ($evento->getListas() as $eventoLista){
             if ($eventoLista->getLista()->getCodListaPreco() == $codLista){
                 $this->remove($eventoLista);
             }
        }
        
        $this->container->get('agp.eventoProduto.repository')->clearByListasAndByEvento($codLista, $evento);
        $this->container->get('agp.habilitaProdutoTerminal.repository')->clearByListasAndByEvento($codLista, $evento);
        
    }
    
     public function addTerminal($terminais, $evento){
     
        foreach ($terminais as $terminal)
        {
            
            $eventos = $terminal->getEventos();
            
            if (!$eventos->isEmpty())
                $atendente = $eventos->get(0)->getAtendente();
            else
                $atendente = null;
            
                $eventoTerminalEmpresa = new EventoTerminalEmpresa;
                $eventoTerminalEmpresa->setTerminalEmpresa($terminal);
                $eventoTerminalEmpresa->setEvento($evento);
                $eventoTerminalEmpresa->setAtendente($atendente);
                $this->em->persist($eventoTerminalEmpresa);
                $this->flush();
            
        }
    }
    
    public function removerTerminal($evento, $codTerminalEmpresa){
        
        foreach ($evento->getTerminais() as $eventoTerminalEmpresa){
             if ($eventoTerminalEmpresa->getTerminalEmpresa()->getCodTerminalEmpresa() == $codTerminalEmpresa){
                 $this->remove($eventoTerminalEmpresa);
             }
        }
        
        $this->container->get('agp.habilitaProdutoTerminal.repository')->clearByTerminalAndByEvento($codTerminalEmpresa, $evento);
        
    }
    
    public function finalizarEvento($evento){
        
        if ($evento->isAtivo()){
//            foreach ($evento->getTerminais() as $eventoTerminalEmpresa){
//                 ->clearByTerminalAndByEvento($eventoTerminalEmpresa->getTerminalEmpresa()->getCodTerminalEmpresa(), $evento);
//                 $eventoTerminalEmpresa->setSituacao(EventoTerminalEmpresa::SIT_INATIVO);
//            }
            
            $this->container->get('agp.habilitaProdutoTerminal.repository')->clearProdutosHabilitadosByEvento($evento);
            $this->container->get('agp.eventoProduto.repository')->clearByEvento($evento);
            $this->container->get('doctrine')->getRepository("AgpCoreBundle:EventoLista")->clearByEvento($evento);
            $this->container->get('doctrine')->getRepository("AgpCoreBundle:EventoTerminalEmpresa")->clearByEvento($evento);
            $this->container->get('doctrine')->getRepository("AgpCoreBundle:AutorizadorValidacao")->clearByEvento($evento);
            $this->container->get('agp.terminalEmpresa.repository')->setEventoNullByEvento($evento);
            $this->repository->deleteAttByEvento($evento);
            
            $evento->getPessoas()->clear();
            
            $evento->setSituacao(Evento::SIT_FINALIZADO);
            $evento->setHabilitaEnvioExtrato(false);
            $this->update($evento);
            
        }
  
    }
    
    public function copiarAmbientes($evento, $eventoAtual){
        $eventoAtual = $this->container->get("agp.evento.manager")->findById($eventoAtual);
        
        $ambientes = $evento->getAmbientes();
        
        $eventoAtual->setTipoMapa($evento->getTipoMapa());
        $eventoAtual->setMapa($evento->getMapa());

        foreach ($ambientes as $a){
            $am = new Ambiente;
            $am->setDescricao($a->getDescricao());
            $am->setEmpresa($a->getEmpresa());
            $am->setEvento($eventoAtual);
            
            foreach ($a->getProdutos() as $p){
                $ap = new AmbienteProduto;
                $ap->setProduto($p->getProduto());
                $am->addProduto($ap);
            }
            
            $am->setQtdeNivel($a->getQtdeNivel());
            
            // PERSISTIR ANTES DE COLOCAR OS SETORES PARA OBTER O COD_AMBIENTE
            $this->container->get('agp.ambiente.manager')->persist($am);
            
            $this->setSetores($a, $am);
            
            $this->container->get('agp.ambiente.manager')->update($am);
        }
        
        $this->update($eventoAtual);

    }
    
    //$listaPai = Pode ser o ambiente ou a listaPai
    public function setSetores($setor, $listaPai){

        foreach ($setor->getSetores() as $s){
            $l = new ListaPreco;
            $l->setNome($s->getNome());
            $codAmbiente = $listaPai instanceof Ambiente ? $listaPai->getCodAmbiente() : $listaPai->getAmbienteForGrupo();
            $l->setAmbienteForGrupo($codAmbiente);
            
            if ($s->getNivel() == 2){
                $l->setVlrSetorFloat($s->getVlrSetor());
                $l->setTipoSetor($s->getTipoSetor());
                if ($s->getCoordenada() != null){
                    $coordenada = new SetorCoordenada;
                    $coordenada->setH($s->getCoordenada()->getH());
                    $coordenada->setW($s->getCoordenada()->getW());
                    $coordenada->setX1($s->getCoordenada()->getX1());
                    $coordenada->setX2($s->getCoordenada()->getX2());
                    $coordenada->setY1($s->getCoordenada()->getY1());
                    $coordenada->setY2($s->getCoordenada()->getY2());
                    $l->setCoordenada($coordenada);
                }
            }
            
            if ($s->getNivel() == 1){
                $l->setSituacao(ListaPreco::SIT_SETOR_DISPONIVEL);
            }
            
            $listaPai->addSetor($l);
            
            if (!$s->getSetores()->isEmpty()){
                $this->setSetores($s, $l);
            }
        }
        
        
    }

}

?>
